home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / mac / files / t_sys5 / 92052tar.gz / 920528.tar / tcpgate.c < prev    next >
C/C++ Source or Header  |  1991-06-02  |  3KB  |  156 lines

  1. /* @(#) $Header: tcpgate.c,v 1.8 91/06/01 22:18:42 deyke Exp $ */
  2.  
  3. #include <sys/types.h>
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <sys/socket.h>
  9. #include <unistd.h>
  10.  
  11. #include "global.h"
  12. #include "mbuf.h"
  13. #include "netuser.h"
  14. #include "tcp.h"
  15. #include "hpux.h"
  16. #include "buildsaddr.h"
  17.  
  18. struct dest {
  19.   int  port;
  20.   char  *name;
  21.   struct dest *next;
  22. };
  23.  
  24. static struct dest *dests;
  25.  
  26. /*---------------------------------------------------------------------------*/
  27.  
  28. static void tcp_send(tcb)
  29. struct tcb *tcb;
  30. {
  31.  
  32.   int  cnt;
  33.   struct mbuf *bp;
  34.  
  35.   if ((cnt = space_tcp(tcb)) <= 0) {
  36.     off_read(tcb->user);
  37.     return;
  38.   }
  39.   if (!(bp = alloc_mbuf(cnt))) return;
  40.   cnt = read(tcb->user, bp->data, (unsigned) cnt);
  41.   if (cnt <= 0) {
  42.     free_p(bp);
  43.     off_read(tcb->user);
  44.     close_tcp(tcb);
  45.     return;
  46.   }
  47.   bp->cnt = cnt;
  48.   send_tcp(tcb, bp);
  49. }
  50.  
  51. /*---------------------------------------------------------------------------*/
  52.  
  53. static void tcp_receive(tcb, cnt)
  54. struct tcb *tcb;
  55. int  cnt;
  56. {
  57.  
  58.   char  buffer[1024];
  59.   struct mbuf *bp;
  60.  
  61.   if (tcb->user > 0) {
  62.     recv_tcp(tcb, &bp, 0);
  63.     while ((cnt = pullup(&bp, buffer, sizeof(buffer))) > 0)
  64.       if (write(tcb->user, buffer, (unsigned) cnt) != cnt) {
  65.     free_p(bp);
  66.     close_tcp(tcb);
  67.     return;
  68.       }
  69.   }
  70. }
  71.  
  72. /*---------------------------------------------------------------------------*/
  73.  
  74. static void tcp_ready(tcb, cnt)
  75. struct tcb *tcb;
  76. int  cnt;
  77. {
  78.   if (tcb->user > 0) on_read(tcb->user, (void (*)()) tcp_send, tcb);
  79. }
  80.  
  81. /*---------------------------------------------------------------------------*/
  82.  
  83. static void tcp_state(tcb, old, new)
  84. struct tcb *tcb;
  85. int  old, new;
  86. {
  87.  
  88.   int  addrlen;
  89.   struct dest *dp;
  90.   struct sockaddr *addr;
  91.  
  92.   switch (new) {
  93. #ifdef  QUICKSTART
  94.   case TCP_SYN_RECEIVED:
  95. #else
  96.   case TCP_ESTABLISHED:
  97. #endif
  98.     log(tcb, "open %s", tcp_port_name(tcb->conn.local.port));
  99.     for (dp = dests; dp && dp->port != tcb->conn.local.port; dp = dp->next) ;
  100.     if (!dp ||
  101.     !(addr = build_sockaddr(dp->name, &addrlen)) ||
  102.     (tcb->user = socket(addr->sa_family, SOCK_STREAM, 0)) <= 0 ||
  103.     connect(tcb->user, addr, addrlen)) {
  104.       close_tcp(tcb);
  105.       return;
  106.     }
  107.     on_read(tcb->user, (void (*)()) tcp_send, tcb);
  108.     return;
  109.   case TCP_CLOSE_WAIT:
  110.     close_tcp(tcb);
  111.     return;
  112.   case TCP_CLOSED:
  113.     if (tcb->user > 0) {
  114.       log(tcb, "close %s", tcp_port_name(tcb->conn.local.port));
  115.       off_read(tcb->user);
  116.       close(tcb->user);
  117.     }
  118.     del_tcp(tcb);
  119.     break;
  120.   }
  121. }
  122.  
  123. /*---------------------------------------------------------------------------*/
  124.  
  125. int  tcpgate1(argc, argv, p)
  126. int  argc;
  127. char  *argv[];
  128. void *p;
  129. {
  130.  
  131.   char  *name;
  132.   char  buf[80];
  133.   struct dest *dp;
  134.   struct socket lsocket;
  135.  
  136.   lsocket.address = INADDR_ANY;
  137.   lsocket.port = tcp_port_number(argv[1]);
  138.   if (argc < 3)
  139.     sprintf(name = buf, "loopback:%d", lsocket.port);
  140.   else
  141.     name = argv[2];
  142.   for (dp = dests; dp && dp->port != lsocket.port; dp = dp->next) ;
  143.   if (!dp) {
  144.     dp = malloc(sizeof(*dp));
  145.     dp->port = lsocket.port;
  146.     dp->name = 0;
  147.     dp->next = dests;
  148.     dests = dp;
  149.   }
  150.   if (dp->name) free(dp->name);
  151.   dp->name = strdup(name);
  152.   open_tcp(&lsocket, NULLSOCK, TCP_SERVER, 0, tcp_receive, tcp_ready, tcp_state, 0, 0);
  153.   return 0;
  154. }
  155.  
  156.